import json
import os
import re
from jsonpath import jsonpath


def join_project_path(file_path_in_project):
    """
    将项目中的某文件与项目路径进行拼接,
    使拼接而成的路径是绝对路径且不受当前执行文件所在路径影响
    :file_path_in_project: 项目里的文件路径
    :return: 项目中文件的绝对路径
    """
    return os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), file_path_in_project))


def get_text_by_jsonpath(json_res, express):
    """
    传入json格式的响应数据及jsonpath表达式,
    根据表达式express从json响应数据中取出所需字段值
    :param json_res: json格式的响应数据
    :param express: jsonpath表达式
    :return: 要提取的字段值
    """
    # 根据表达式取出字段值
    value = jsonpath(json_res, express)
    if value is not False:
        return value[0]
    else:
        raise ValueError(f"表达式: {express} 在 字段: {json_res} 中 找不到!")


def replace_var_to_value(req_methods_args, global_var_dict):
    # 存放参数中含有要引用的变量值的列表
    is_has_var_list = re.findall(r'\$(.*?)\$', req_methods_args)
    # 如果列表中有要引用的变量值, 将参数值的变量名一一替换为对应的变量值
    if len(is_has_var_list):
        for global_var_dict_key in is_has_var_list:
            # 获取字典中对应的值, 并保留其类型, 例如将字符串值包含在双引号中
            global_var_dict_value = json.dumps(global_var_dict[global_var_dict_key])
            # 替换占位符为字典中的值
            req_methods_args = re.sub(r'\$(' + re.escape(global_var_dict_key) + r'\$)', global_var_dict_value,
                                      req_methods_args)
    return req_methods_args
